変数:VAR_IN_OUT
A VAR_IN_OUT variableは入力/出力変数であり、POUインターフェースの一部であり、正式な参照渡しパラメーターとして機能します。
構文
<keyword> <POU name>
VAR_IN_OUT
<variable name> : <data type>;
END_VAR
<keyword> : FUNCTION | FUNCTION_BLOCK | METHOD | PRG入出力変数を宣言できます。 VAR_IN_OUT POU の宣言セクション PRG、 FUNCTION_BLOCK、 METHOD、 または FUNCTION。の VAR_IN_OUT 変数の読み書きが可能です。
電話:POUが呼び出されると、正式な
VAR_IN_OUTvariableは、引数として実際の変数( "pass-by-reference変数")を受け取ります。実行時に、パラメーターが渡されたときにコピーは生成されません。代わりに、仮変数は、リモートで渡された実際の変数への参照を受け取ります。参照変数には、実際の値に対する値として内部にメモリアドレスが含まれています(ポインタとして渡す、 コールバイリファレンス)。定数(リテラル)またはビット変数を引数として直接指定することはできません。POU内の読み取り/書き込みアクセス:変数がPOU内に書き込まれる場合、これは渡される変数に影響します。 POUが終了すると、実行された変更はすべて保持されます。これは、POUが
VAR_IN_OUT呼び出し元のPOUがその変数を使用するのと同じように、変数。読み取りアクセスは常に許可されます。リモートでの読み取り/書き込みアクセス:
VAR_IN_OUT変数 できません を介してリモートで直接読み取りまたは書き込み<function block instance name>.<variable name>。これは次の場合にのみ機能しますVAR_INPUTとVAR_OUTPUT変数。文字列変数を渡す:文字列変数が引数として渡される場合、実際の変数と仮変数は同じ長さである必要があります。そうしないと、渡された文字列が意図せずに操作される可能性があります。この問題は、次の場合には発生しません。
VAR_OUTPUT CONSTANTパラメーター。ビット変数の受け渡し:ビット変数を直接に渡すことはできません
VAR_IN_OUT中間変数が必要なため、変数。プロパティの受け渡し: 許可されていません
ヒント
文字列が変数または定数としてフォーマルに渡される場合 VAR_IN_OUT CONSTANT 変数の場合、文字列は自動的に完全に渡されます。文字列の長さを確認する必要はありません。
詳細については、以下を参照してください。 「VAR_IN_OUTCONSTANT」転送変数
配列の受け渡し
TYPE DUT_A :
STRUCT
xA: BOOL;
iB: INT;
END_STRUCT
END_TYPE
FUNCTION_BLOCK FB_SetArray
VAR_IN_OUT
aData_A : ARRAY[0..1] OF DUT_A; // Formal variable
END_VAR
aData_A[0].xA := TRUE;
aData_A[0].iB := 100;
PROGRAM PLC_PRG
VAR
fbSetA : FB_SetArray;
aSpecialData : ARRAY[0..1] OF DUT_A; // Actual variable
END_VAR
fbSetA(aData_A := aSpecialData);
文字列を渡す
{attribute 'qualified_only'}
VAR_GLOBAL
g_sDEV_STATUS : STRING(25) := 'Device_A';
END_VAR
FUNCTION_BLOCK FB_SetStatus
VAR_IN_OUT
sDeviceStatus : STRING(25); // Formal parameter
END_VAR
sDeviceStatus := CONCAT(sDeviceStatus, ' Activ');
PROGRAM PLC_PRG
VAR
fbDoB : FB_SetStatus;
END_VAR
fbDoB(sDeviceStatus := GVL.g_sDEV_STATUS); //Call with actual parameter変数 sDeviceStatus のPOUインターフェースの一部です FB_B。電話するとき fbDoB、最初にデバイス名が文字列に割り当てられ、次に文字列が操作されます。

ビット変数の受け渡し
VAR_GLOBAL
xBit0 AT %MX0.1 : BOOL;
xTemp : BOOL;
END_VAR
FUNCTION_BLOCK FB_DoSomething
VAR_INPUT
xIn : BOOL;
END_VAR
VAR_IN_OUT
xInOut : BOOL;
END_VAR
IF xIn THEN
xInOut := TRUE;
END_IF
PROGRAM PLC_PRG
VAR
xIn : BOOL;
DoSomething_1 : FB_DoSomething;
DoSomething_2 : FB_DoSomething;
END_VAR
// The following line of code causes a compiler error:
// C0201: Typ 'BIT' is not equal to type 'BOOL' of VAR_IN_OUT 'xInOut'
DoSomething_1(xIn := xIn, xInOut := xBit0);
// Workaround
xTemp := xBit0;
DoSomething_2(xIn := xIn, xInOut := xTemp);
xBit0 := xTemp;プログラムは機能ブロックインスタンスを呼び出します DoSomething_1 と DoSomething_2。ビット変数の直接割り当ての結果として xBit0 に VAR_IN_OUT 入力の場合、コンパイラエラーが生成されます。 DoSomething_1 インスタンスが呼び出されます。対照的に、 DoSomething_2 中間変数が割り当てられたインスタンスは正しいコードです。
転送変数 VAR_IN_OUT CONSTANT
A VAR_IN_OUT CONSTANT 変数は、定数の参照渡しパラメーターとして機能します。 STRING また WSTRING 型変数または定数(リテラル)を渡すことができます。パラメータは読み取ることはできますが、書き込むことはできません。プロパティの通過は許可されていません。
構文宣言
<keyword> <POU name>
VAR_IN_OUT CONSTANT
<variable name> : <data type>; // formal parameter
END_VAR
<keyword> : FUNCTION | FUNCTION_BLOCK | METHOD | PRGVAR_IN_OUT CONSTANT 変数は、初期化値を割り当てずに宣言されます。
POUを呼び出す場合、
STRINGまたWSTRING定数変数またはリテラルを渡すことができます。したがって、書き込みアクセスは許可されません。文字列定数のパラメータの受け渡し:定数の文字列の長さは任意のサイズにすることができ、文字列の長さは文字列の長さに依存しません
VAR_IN_OUT CONSTANT変数。
ヒント
の場合 定数を置き換える オプションはで選択されています の中に コンパイルオプション カテゴリの場合、基本データ型の定数または基本データ型の定数変数のパラメータを渡すと、コンパイラエラーが発生します。
ヒント
この変数は、コンパイラバージョン> = 3.5.2.0でサポートされています。
文字列定数と文字列変数のパラメータを渡す
FUNCTION funManipulate : BOOL
VAR_IN_OUT
sReadWrite : STRING(16); (* Can be read or written here in POU *)
dwVarReadWrite : DWORD; (* Can be read or written here in POU *)
END_VAR
VAR_IN_OUT CONSTANT
c_sReadOnly : STRING(16); (* Constant string variable can only be read here in POU *)
END_VAR
sReadWrite := 'String_from_POU';
dwVarReadWrite := STRING_TO_DWORD(c_sReadOnly);
PROGRAM PRG_A
VAR
sVarFits : STRING(16);
sValFits : STRING(16) := '1234567890123456';
dwVar: DWORD;
END_VAR
// The following line of code causes the compiler error C0417:
// C0417: VAR_IN_OUT parameter 'sReadWrite' needs a variable with write access as input.
funManipulate(sReadWrite:='1234567890123456', c_sReadOnly:='1234567890123456', dwVarReadWrite := dwVar);
// Correct code
funManipulate(sReadWrite := sValFits, c_sReadOnly := '23', dwVarReadWrite := dwVar);
funManipulate(sReadWrite := sVarFits, c_sReadOnly := sValFits, dwVarReadWrite := dwVar);コードでは、文字列はに渡されます funManipulate 異なる経由で機能 VAR_IN_OUT 変数。文字列リテラルを渡すと、コンパイラエラーが出力されます。 VAR_IN_OUT 変数。定数変数をに渡すとき VAR_IN_OUT CONSTANT 変数、文字列変数を渡す場合でも正しいコードが生成されます。